/**
* 障碍物管理器，数据和逻辑都是它，注意这个是一个模块，自己能加载
* 1,分析它的功能
* 
* 注意如果要加一个障碍物的话，是要setData和setBar都要的
*/
package kgame5.kgu {
import kgame5.k3d.core.obj3d.spacial.SpacialVO;
import kgame5.k3d.core.obj3d.node3d.Node3D;
import kgame5.kgu.move.XPosiM;
import kgame5.kmath.MathDG;
import kgame5.kutil.*;

public class BarsM{
	//_________________Property_____________________
	
	private var a2Data:Array;//0表示是空的,1,2,3表示有实体,-1,-2,-3做其他用途
	private var RC:int,CC:int;
	private var CellSize:Number;
	
	private var a2Bar:Array;//保存障碍物模型用的饿
	
	
	//_________________Method_____________________
	public function BarsM(p_CellSize:Number){
		
		CellSize=p_CellSize;
	}
	
	//生出w,h
	public function getWidth():int{
		return getCC()*getCellSize();
	}
	public function getHeight():int{
		return getRC()*getCellSize();
	}
	//
	public function getCC():int{
		return CC;
	}
	public function getRC():int{
		return RC;
	}
	public function getCellSize():Number{
		return CellSize;
	}
	
	public function getBar(r:int,c:int):Node3D{
		return a2Bar[r][c];
	}
	
	//障碍物是在外部生成的，所依需要外部生成之后设置一下这个
	public function setBar(r:int,c:int,md_bar:SpacialVO){
		//
		a2Bar[r][c]=md_bar;
		
		//设置位置
		var x : Number = calcX(c);
		var z : Number =calcZ(r);
		md_bar.v3d_p.fill(x, 0, z);
	}
	
	//这个是标志一个临时的格子为障碍物，比如有炸弹的时候
	public function setData(r:int,c:int){
		a2Data[r][c]=10000;//data;
	}
	public function clearData(r:int,c:int){
		a2Data[r][c]=0;
	}
	
	public function getData(r:int,c:int):int{
		if(r<0||r>RC-1||c<0||c>CC){
			return 1;//如果出了边界表示是一个障碍物
		}
		return a2Data[r][c];
	}
	public function getDataArray2():Array{
		return a2Data;
	}
	//填充数据,这个是很必要的！
	public function Init(p_a2Data:Array){
		//trace("BarsM.Init:",p_a2Data);
		
		a2Data=Util.CopyArray2(p_a2Data);
		RC=a2Data.length;
		CC=a2Data[0].length;
		
		a2Bar=Util.NewArray2_Obj(RC, CC);
		
		//自己维持一个空位置的列表
		makeEmptyCellList();
	}
	//释放资源
	public function Clear(){
		for(var r:int=0;r<RC;r++){
			for(var c:int=0;c<CC;c++){
				destroyBar(r,c);
			}
		}
	}
	
	//表示一个障碍物被消灭,这个具体特效在外面做，总之在里面这个东西就算消失了
	public function destroyBar(r:int,c:int){
		if(a2Data[r][c]==0){
			return;
		}
		
		var md_g:Node3D=a2Bar[r][c];
		md_g.dispose();
		a2Bar[r][c]=null;//注意顺序
		a2Data[r][c]=0;
	}
	
	
	
	public function calcX(c:int):Number{
		return XPosiM.calcX(c, CellSize);
	}
	public function calcZ(r:int):Number{
		return XPosiM.calcZ(r, CellSize);
	}
	
	public function calcCol(x:Number):int{
		return XPosiM.calcCol(x, CellSize);
	}
	public function calcRow(z:Number):int{
		return XPosiM.calcRow(z, CellSize);
	}
	
	//维持一个空位置的列表,用来随机放东西用的，很有用
	private function makeEmptyCellList(){
		aEmptyCellList=new Array();
		for(var r:int=0;r<RC;r++){
			for(var c:int=0;c<CC;c++){
				if(getData(r, c)==0){
					var x:int=calcX(c);
					var z:int=calcZ(r);
					aEmptyCellList.push({x:x,z:z});
				}
			}
		}
	}
	//这个是维持一个空的位置的列表，这样敌人出生的时候比较好弄啊
	private  var aEmptyCellList:Array;
	//返回的是{x,z}
	public  function getRandomEmptyCellPosi():Object{
		var idx:int=MathDG.random(0, aEmptyCellList.length-1);
		var temp:Object=aEmptyCellList[idx];
		return temp;
	}
	
	//地图的四个角落，用来产生敌人用的
	private var bornIdx:int;
	public function getNextCornerPosi():Object{
		bornIdx++;
		bornIdx%=4;
		
		return getCornerPosi(bornIdx);
	}
	//得到某个四个角的位置
	//01
	//32
	public function getCornerPosi(cornerIdx:int):Object{
		var x:int,z:int,rotY:int;
		switch(cornerIdx){
			case 0:
			x=calcX(0);
			z=calcZ(0);
			rotY=180;
			break;
			case 1:
			x=calcX(CC-1);
			z=calcZ(0);
			rotY=180;
			break;
			case 2:
			x=calcX(CC-1);
			z=calcZ(RC-1);
			rotY=0;
			break;
			case 3:
			x=calcX(0);
			z=calcZ(RC-1);
			rotY=0;
			break;
		}
		return {x:x,z:z,rotY:rotY};
	}
	
	//返回的是一个{col,row}//碰上的障碍物的坐标
	public function HitTestMD(md:SpacialVO):Object{
		for(var r:int=0;r<RC;r++){
			for(var c:int=0;c<CC;c++){
				if(getData(r,c)!=0){
					var b:Boolean=XPosiM.hitTest(md.v3d_p.x, md.v3d_p.y, md.v3d_p.z, md.aabb.A, md.aabb.B, md.aabb.H, a2Data, CellSize, r, c);
					if(b){
						return {col:c,row:r};
					}
				}
			}
		}
		return null;
	}
}//end of class
}